import axios from 'axios';
import Store from '../store/index';
import message from 'element-ui/lib/message';
import Router from '../router';
// 创建一个实例进行配置
const ips = {
  development: 'http://localhost:3000',
  production: 'http://127.0.0.1:3000'
};
const Axios = axios.create({
  // 开发环境中使用测试接口，生产环境中使用线上
  baseURL: ips[process.env.NODE_ENV]
});

// 开启token
const createToken = config => {
  // token值是vuex里的token
  const token = Store.state.users.token;
  // 将token放在请求头中
  config.headers.common['Authorization'] = token;
  return config;
};
// 开启请求前的钩子
Axios.interceptors.request.use(
  config => {
    // 判断用户操作为退出时携带 tokan
    if (config.url === '/user/login' && config.data.state === 0) {
      // 将token添加到请求头
      return createToken(config);
    }
    // 登录注册不携带token
    if (config.url === '/user/login' || config.url === '/user/register') {
      // 配置token
      return config;
    }
    // 除了登录注册其他请求都给请求头带上 tokan令牌
    return createToken(config);
  },
  err => {
    // 抛出错误
    Promise.reject(err);
  }
);
// 响应请求的结果函数
// 只要用来判断 token 是否过期
Axios.interceptors.response.use(
  config => {
    // 不是200说明请求出错
    // 请求正确并且请求结果为true不做处理直接返回给前端判断
    if (config.status === 200 && config.data.code) {
      return config.data;
    } else {
      // 排除登录和注册的请求返回结果
      // tokan过期
      if (config.data.data.token === false) {
        // 提醒用户您的tokan过期了
        message.error(config.data.msg || 'token过期了');
        // 把store中的用户状态改成 0
        Store.commit('setUser', { token: null, loginState: 0 });
        // 跳转到登录页
        Router.replace('/user');
      } else {
        message.error(config.data.mag || '接口错误');
      }
      return config.data.data || { code: 0 };
    }
  },
  err => Promise.reject(err)
);
export default Axios;
